

typedef enum disktype_t
{
	DISK_VHD_FIXED,
	DISK_VHD_DYNAMIC,
	DISK_VHD_DIFF,
	DISK_VMDK_FIXED,
	DISK_VMDK_DYNAMIC,
	DISK_VMDK_DIFF,
	DISK_VDI_FIXED,	
	DISK_VDI_DYNAMIC,
	DISK_VDI_DIFF,
	DISK_PHYS,
	DISK_RAW
} disktype;

typedef unsigned long disksize;

class DiskBase
{
protected:
	int bps;
	disksize size;
	disktype type;

public:
	DiskBase() {} ;
	virtual int Attach(char *file);
	virtual int Create(char *file, disktype type, disksize sz);
	virtual int Convert(char *file, disktype type);
	int GetBPS();
	disksize GetSize();
	disktype GetType();
};

class VHDDisk : public DiskBase
{
public:
	VHDDisk() {};
	virtual int Attach(char *file);
	virtual int Create(char *file, disktype type, disksize sz);
	virtual int Convert(char *file, disktype type);
};

class RawDisk : public DiskBase
{
public:
	virtual int Attach(char *file);
	virtual int Create(char *file, disktype type, disksize sz);
	virtual int Convert(char *file, disktype type);
};

class VMDKDisk : public DiskBase
{
public:
	virtual int Attach(char *file);
	virtual int Create(char *file, disktype type, disksize sz);
	virtual int Convert(char *file, disktype type);
};

class PhysicalDisk : public DiskBase
{
public:
	virtual int Attach(char *file);
	virtual int Create(char *file, disktype type, disksize sz);
	virtual int Convert(char *file, disktype type);
};

class VDIDisk : public DiskBase
{
	virtual int Attach(char *file);
	virtual int Create(char *file, disktype type, disksize sz);
	virtual int Convert(char *file, disktype type);
};







class Disk
{
private:
	DiskBase *diskobject;

public:
	Disk() {} ;
	int Attach(char *file);
	int Create(char *file, disktype type, disksize sz);
	int Convert(char *file, disktype type);
	disksize GetSize();
	disktype GetType();
	disktype GetBytesPerSec();
};





